package com.study.kt._03coroutines

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull

/**
 * <pre>
 *     author : slx
 *     time   : 2021/04/04
 *     desc   : Flow的取消：与协程的取消是一种协同操作。Flow的收集操作时可以取消的
 *     前提是Flow在一个可取消的挂起函数(如delay)中被挂起了，除此之外我们无法通过其他方式取消Flow
 * </pre>
 */
fun main() {
    runBlocking {
        // 一种挂起函数，超过280ms，没直接完直接中止，相当于将flow取消了
        withTimeoutOrNull(280) {
            cancelFlow().collect { println(it) }
        }
    }
}

private fun cancelFlow(): Flow<Int> {
    return flow {
        for (i in 0..4) {
            delay(100)
            emit(i)
        }
    }
}